package cohesion.io
{
	import flash.events.TimerEvent;
	import flash.utils.Dictionary;
	import flash.utils.Timer;
	import flash.utils.getTimer;
	
	/**
	 * 资源缓存器
	 * <p>此类并非静态和单例类，如果需要，完全可以创建多个实例，在不同的地方使用</p>
	 * 
	 * @author 徐俊杰
	 * @date 2012-2-21
	 */
	public class ResourceCache
	{
		private const RESOURCE:String = "resource";
		private const TIME:String = "time";
		
		private var _dic:Dictionary;
		private var _destroyTimer:Timer;
		
		private var _storageTime:Number = 180000;
		
		/**
		 * 实例化资源缓存 
		 * 
		 */		
		public function ResourceCache()
		{
			_dic = new Dictionary();
		}
		
		/**
		 * 添加资源 
		 * @param url 资源路径，做为标识
		 * @param resource 资源，可以是任何类型，甚至是null,如果你确定需要。
		 * 
		 */		
		public function addResource(url:String, resource:*):void
		{
			if(!_dic[url] || _dic[url] != resource)
			{
				_dic[url] = createItem(resource);
				if(!_destroyTimer.running)
					_destroyTimer.start();
			}
		}
		
		private function createTimer():void
		{
			_destroyTimer = new Timer(60000);
			_destroyTimer.addEventListener(TimerEvent.TIMER, destroyTimer_timerHandler);
		}
		
		/**
		 * @private
		 * 
		 */		
		protected function destroyTimer_timerHandler(event:TimerEvent):void
		{
			var currentTime:Number = getTimer();
			var count:int = 0;
			for(var url:String in _dic)
			{
				count++;
				if(currentTime - _dic[url][TIME] >= _storageTime)
				{
					delete _dic[url];
				}
			}
			if(count == 0)
			{
				_destroyTimer.stop();
			}
		}
		
		private function createItem(resource:*):Dictionary
		{
			var result:Dictionary = new Dictionary();
			result[RESOURCE] = resource;
			result[TIME] = getTimer();
			return result;
		}
		
		/**
		 * 删除资源
		 * <p>大部分情况下，不需要使用此方法，因为会自动删除过期的资源。
		 * 如果需要清空，可以使用clear()方法.
		 * </p> 
		 * @param url 资源路径
		 * @return 被删除的资源，如果资源不存在，返回null
		 * 
		 * @see #clear()
		 * 
		 */		
		public function removeResource(url:String):*
		{
			if(_dic[url])
			{
				var result:* = _dic[url][RESOURCE];
				delete _dic[url];
				return result;
			}
			return null;
		}
		
		/**
		 * 获取资源 
		 * @param url 资源路径
		 * @return 资源，如果不存在，返回空
		 * 
		 */		
		public function getResource(url:String):*
		{
			if(_dic[url])
				return _dic[url][RESOURCE];
			return null;
		}
		
		/**
		 * 清空所有的资源 
		 * 
		 */		
		public function clear():void
		{
			_dic = new Dictionary();
		}

		/**
		 * 资源保存的毫秒数，超过此值的将被释放 
		 * @default 180000毫秒
		 */
		public function get storageTime():Number
		{
			return _storageTime;
		}

		/**
		 * @private
		 */
		public function set storageTime(value:Number):void
		{
			_storageTime = value;
		}

	}
}